import re
from datetime import datetime

from enetity_extraction.json_result import generate_return_json
from logic_rule.case_code_check import split_number

# 将中文数字转换为阿拉伯数字的映射
chinese_to_digit = {
    '〇': '0', '一': '1', '二': '2', '三': '3', '四': '4',
    '五': '5', '六': '6', '七': '7', '八': '8', '九': '9'
}


# '年': '年', '月': '月', '日': '日'

def chinese_date_to_datetime(date_dic):
    result = generate_return_json()
    # 这里需要案号的日期，取一下
    if date_dic['案号'] == {}:
        case_code_year = False
    else:
        case_code_str = date_dic['案号']['match']
        case_code_year, case_code_region, case_code_case_type, case_code_case_number = split_number(case_code_str)

    # 开始正式的审判时间
    if date_dic['审判时间'] == {}:
        # print('审判时间书写错误')
        result['type'] = '审判时间缺失'
        return result
        # return None

    date_str = date_dic['审判时间']['match']
    # result赋值
    result['paragraph_index'] = date_dic['审判时间']['paragraph_index']
    result['start'] = date_dic['审判时间']['start_pos']
    result['end'] = date_dic['审判时间']['end_pos']
    result['offset'] = date_dic['审判时间']['end_pos'] - date_dic['审判时间']['start_pos'] + 1

    # 替换年份部分
    year = ''
    for char in date_str[:4]:
        if char not in chinese_to_digit:  # 检查是否是数字的
            result['type'] = '审判时间不符合规范'
            return result
        year += chinese_to_digit[char]

    # 判断是否 符合落款和案号年份相差过大的问题
    if case_code_year and int(year) - int(case_code_year) >= 3 or int(year) - int(case_code_year) < 0:
        result['type'] = '审判时间不符合规范'
        return result

    # 查找月份部分
    month_start = date_str.find('年') + 1
    month_end = date_str.find('月')
    month_str = date_str[month_start:month_end]
    # 检查是否是数字的
    for char in month_str:
        if not '\u4e00' <= char <= '\u9fff':  # 检查是否是数字的
            result['type'] = '审判时间不符合规范'
            return result

    month_multi = 1
    month_total = 0
    if month_str[0] != '十':
        month_multi = int(chinese_to_digit[month_str[0]])
    for i in range(len(month_str)):
        if month_str[i] == '十':
            month_total = 0
            month_total = month_total + month_multi * 10
            month_multi = 1
        else:
            month_multi = int(chinese_to_digit[month_str[i]])
            month_total = month_total + int(chinese_to_digit[month_str[i]])

    # 查找日期部分
    day_start = month_end + 1
    day_end = date_str.find('日')  # 号或日
    if day_end == -1:
        day_end = date_str.find('号')
    day_str = date_str[day_start:day_end]
    # 检查是否是数字的
    for char in day_str:
        if not '\u4e00' <= char <= '\u9fff':  # 检查是否是数字的
            result['type'] = '审判时间不符合规范'
            return result

    data_multi = 1
    data_total = 0
    if day_str[0] != '十':
        data_multi = int(chinese_to_digit[day_str[0]])
    for i in range(len(day_str)):
        if day_str[i] == '十':
            data_total = 0
            data_total = data_total + data_multi * 10
            data_multi = 1
        else:
            data_multi = int(chinese_to_digit[day_str[i]])
            data_total = data_total + int(chinese_to_digit[day_str[i]])

    # if (day_end - day_start) == 3:
    #
    #     day = f"{chinese_to_digit[day_str[0]]}{chinese_to_digit[day_str[-1]]}"
    # elif (day_end - day_start) == 2:
    #     if day_str[-1] == '十':
    #         day = f"{chinese_to_digit[day_str[0]]}{'0'}"
    #     else:

    # 构建阿拉伯数字格式的日期字符串
    date_str = f"{year}-{str(month_total)}-{str(data_total)}"
    # 尝试将字符串解析为日期对象,如果是不合法日期（例如，2024-02-30），
    # 则 datetime.strptime 会引发 ValueError 异常，导致 except 块执行并返回 None。
    try:
        date_obj = datetime.strptime(date_str, "%Y-%m-%d")
        # 检查日期是否超过当前日期
        if date_obj > datetime.now():
            result['type'] = '审判时间错误'
            return result

        # 当 日期合法 和 审判日期小于当前日期，则视为合法
        result['type'] = '审判时间合法'
        # return result
        # return None
    except ValueError:
        # print('审判时间合法')
        result['type'] = '审判时间错误'
        return result


def find_dates(text):
    # 定义正则表达式
    pattern = r'\d{4}年\d{1,2}月\d{1,2}日'

    # 使用 re 模块的 finditer 函数进行匹配
    matches = list(re.finditer(pattern, text))

    # 构建结果列表和位置信息列表
    dates = [match.group(0) for match in matches]
    positions = [match.start() for match in matches]

    return dates, positions


def find_different_indexes(dates):
    # 如果输入的日期列表为空，则直接返回空列表
    if not dates:
        return []

    # 找到最后一个日期
    last_date = dates[-1]

    # 找到与最后一个日期不同的日期的索引位置
    different_indexes = [i for i, date in enumerate(dates) if date != last_date]

    return different_indexes


def is_valid_date(date_str):
    try:
        # 将字符串转换为datetime对象
        date = datetime.strptime(date_str, "%Y年%m月%d日")
        return True
    except ValueError:
        return False


def check_invalid_date_with_trial_date(text):
    # 找到所有日期及其位置
    dates, positions = find_dates(text)
    print("匹配到的日期：", dates)
    print("每个日期的第一个字符位置：", positions)

    # 查找匹配的审判日期，假设审判日期只有一个
    pattern = r"二[〇一二三四五六七八九]{3}年[一二三四五六七八九十]{1,2}月[一二三四五六七八九十]{1,3}日"
    matches = re.findall(pattern, text)

    # 验证审判日期合法性,
    valid_shenpan_dates = []
    for match in matches:
        date_obj = chinese_date_to_datetime(match)
        if date_obj:
            valid_shenpan_dates.append(match)

    if not valid_shenpan_dates:
        print("审判日期不合法")
    else:
        # 获取 valid_dates 列表中的最后一个日期
        last_valid_shenpan_date_str = valid_shenpan_dates[-1]
        last_valid_shenpan_date = chinese_date_to_datetime(last_valid_shenpan_date_str)
        print("合法的审判日期：", last_valid_shenpan_date_str)

    # 创建一个列表，标记合法和不合法的日期
    validity_list = [1 if is_valid_date(date) else 0 for date in dates]
    print("日期合法性列表：", validity_list)

    # 筛选出合法的日期
    valid_dates = [date for date in dates if is_valid_date(date)]
    print("合法的日期：", valid_dates)

    # 将给定的日期字符串转换为 datetime 对象
    given_dates = []
    for date_str in valid_dates:
        date_obj = datetime.strptime(date_str, "%Y年%m月%d日")
        given_dates.append(date_obj)

    days_diff = []
    if valid_shenpan_dates:
        # 计算与 valid_dates[-1] 相差的天数
        for date in given_dates:
            diff = (date - last_valid_shenpan_date).days
            days_diff.append(diff)
    print("相差日期列表：", days_diff)


if __name__ == "__main__":
    test_text = "2019年12月15日，2020年12月1日，2021年7月31日，2022年2月28日，2025年2月28日，今天的日期是二〇二五年二月二十八日，这是一个特别的日子。"
    check_invalid_date_with_trial_date(test_text)
